package futbol.tacticas.concursantes.TacticaChorra;

import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;
import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

/**
 * 
 * @author Dimas
 */
public class TacticaChorra implements Tactica {

	int golesAFavor = 0;

	int tiempo = 0;

	int signoDesvioChute = 1;

	Point bolaAnt = new Point();

	private int nValoresUltraDefensa[][] = { { -150, -28, 7 }, // Defensa - 1
			{ -150, -15, 7 }, // Defensa - 2
			{ -150, 5, 7 }, // Defensa - 3
			{ -150, 24, 7 }, // Defensa - 4
			{ -60, -80, 4 }, // Medio-escoba - 5
			{ -60, -20, 4 }, // Medio - 6
			{ -60, 20, 4 }, // Medio - 7
			{ -60, 80, 4 }, // Medio-escoba - 8
			{ 80, -60, 8 }, // Delantero derecho - 9
			{ 120, 0, 9 }, // Delantero centro - 10
			{ 90, 60, 7 } // Delantero izquierdo - 11
	};

	private int nValores352[][] = { { -150, 0, 6 }, // Jugador 1[0]
			{ -80, -35, 4 }, // Jugador 2[1]
			{ -100, 0, 6 }, // Jugador 3[2]
			{ -90, 40, 4 }, // Jugador 4[3]
			{ -20, 70, 2 }, // Jugador 5[4]
			{ 20, 65, 2 }, // Jugador 6[5]
			{ 0, 20, 8 }, // Jugador 7[6]
			{ 0, -20, 8 }, // Jugador 8[7]
			{ 20, -65, 1 }, // Jugador 9[8]
			{ 110, -20, 9 }, // Jugador 10[9]
			{ 115, 20, 8 } // Jugador 11[10]
	};

	private int nValores[][] = nValores352;

	/** Creates a new instance of TacticaDimas */
	public TacticaChorra() {
	}

	public String getNombre() {
		return "C.F.TeloPeto";
	}

	public Color getColor1() {
		return Color.orange;
	}

	public Color getColor2() {
		return new Color(30, 140, 255);
	}

	public Color getColorNumero() {
		return Color.WHITE;
	}

	public int getFuerza(int n) {
		return nValores[n][2];
	}

	public int getXInicial(int n) {
		return nValores[n][0];
	}

	public int getYInicial(int n) {
		return nValores[n][1];
	}

	private void updateMarcador(SituacionJugadores sj) {

		tiempo++;

		Point bola = sj.getBola();
		int nXBola = (int) bola.getX();
		if (bolaAnt.x > 150 && nXBola < 40) {
			golesAFavor++;
		}
		if (bolaAnt.x < -150 && nXBola > -40) {
			golesAFavor--;
		}

		tiempo++;

		tiempo = tiempo % 1800;

		bolaAnt = bola;

		// System.out.println("Diferencia de goles, tiempo:"+golesAFavor + " , "
		// +tiempo);
	}

	public Vector<Comando> getComandos(SituacionJugadores sj) {

		updateMarcador(sj);

		Point[] misJugadores = sj.getMisJugadores();
		Point[] contrarios = sj.getContrario();

		Vector<Comando> comandos = new Vector<Comando>();

		int numDelanteros = 3;

		// Cambiamos de tactica dependiendo resultado
		if (golesAFavor >= 1) {
			numDelanteros = 3;
			recolocarJugadores(comandos, nValoresUltraDefensa);
		} else {
			numDelanteros = 2;
			recolocarJugadores(comandos, nValores352);

		}

		// A por la pelota
		int nJug = sj.getMasCercanoDeBola();
		if (nJug == 0) {
			nJug = sj.getSiguienteJugador(nJug);
		}
		Point pelota = sj.getBola();
		comandos.add(new ComandoIrA(nJug, pelota.getX(), pelota.getY()));

		// Movimiento portero

		muevePortero(sj, comandos);

		// Tiran a puerta los delanteros
		for (int n = 0; n < 11; n++) {
			try {
				int sigJug = sj.getSiguienteJugador(n);
				// Si es el saque de centro
				if ((pelota.getX() == 0) && (pelota.getY() == 0)) {
					comandos.add(new ComandoGolpearBola(n, -34, 0));
				} else if (n >= 11 - numDelanteros)
					chuteAPuerta(comandos, n, sj);
				else if (n > 3) {
					if (!enMedio(misJugadores[n], misJugadores[9], contrarios))
						comandos.add(new ComandoPase(n, 9));
					else if (!enMedio(misJugadores[n], misJugadores[8],
							contrarios))
						comandos.add(new ComandoPase(n, 8));
					else if (!enMedio(misJugadores[n], misJugadores[10],
							contrarios))
						comandos.add(new ComandoPase(n, 10));
					else
						comandos.add(new ComandoPase(n, sigJug));
				} else {
					if (!enMedio(misJugadores[n], misJugadores[n+4],
							contrarios))
						comandos.add(new ComandoPase(n, n+4));
					else comandos.add(new ComandoGolpearBola(n, 120, -10));
				}
			} catch (Exception ex) {
				chuteAPuerta(comandos, n, sj);
			}
		}
		return comandos;
	}

	// devuelve verdadero si hay un contrario entre dos jugadores de mi equipo
	// m1 y m2 representas la pendiente de la función de la recta dibujada entre
	// dos puntos.
	// teniendo en cuenta que las dos rectas tienen el mismo punto de origen, si
	// m1==m2 las dos rectas son iguales
	private boolean enMedio(Point pasador, Point receptor, Point[] contrario) {
		double m1, m2;
		boolean respuesta = false;
		m1 = (pasador.getY() - receptor.getY())
				/ (pasador.getX() - receptor.getX());
		for (int n = 0; n < 11; n++) {
			m2 = (pasador.getY() - contrario[n].getY())
					/ (pasador.getX() - contrario[n].getX());

			if (m1 == m2) {
				respuesta = true;
				break;
			}
		}

		return respuesta;
	}

	private void muevePortero(SituacionJugadores sj, Vector<Comando> com) {

		int y = (int) (sj.getBola().getY() / 2);
		if (y < -25)
			y = -25;
		if (y > 25)
			y = 25;
		com.add(new ComandoIrA(0, -155, y));
	}

	private void recolocarJugadores(Vector<Comando> comandos,
			int nValoresNuevo[][]) {
		nValores = nValoresNuevo;
		for (int n = 1; n < 11; n++)
			comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
	}

	private void chuteAPuerta(Vector<Comando> com, int nJug,
			SituacionJugadores sj) {
		// Comprobamos que estamos cerca para chutar
		// if (sj.getBola().getX()>60 && Math.abs(sj.getBola().getY())<120){
		signoDesvioChute = signoDesvioChute * (-1);
		com.add(new ComandoTiroAPuerta(nJug,
				(int) ((Math.random()) * Math.PI * Math.E) * signoDesvioChute));
		// }
		// else{
		// com.add(new ComandoPase(nJug, nJug+1));
		// }

	}


}
